/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package moteur.partie;

import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import moteur.Transport;
import moteur.carte.Chemin;
import moteur.carte.EmplacementLegal;
import moteur.carte.MouvementLegal;
import moteur.paquet.PaquetCartesVoyages;
import moteur.paquet.PaquetPionTransport;
import moteur.paquet.PaquetVideException;
import moteur.paquet.PionsEnMain;
import moteur.paquet.TypeMismatchException;

/**
 *
 * @author nlupins
 */
public class JoeurAlea extends Joeur {

    /**
     * Constructeur
     * @param nom
     */
    public JoeurAlea(String nom) {
        super(nom);
        //this.p = Partie.getInstance();
        p.addJoeur(this);
    }

    /**
     * Fait choisir un pion au joeurAléa parmis une "main" de pions disponibles.
     * @param choix
     */
    @Override
    public void choisiPion(PionsEnMain choix) {
        try {
            Transport t = Transport.values()[pions.piocher2(choix)];
            this.fireEventToListeners(null, t, null);
        } catch (Exception e) {
        }
        super.updatePartie();
    }

    /**
     * Fait se défausser le joeur.
     */
    @Override
    public void defausse() {
        try {
            if (pions.total() > 0) {
                pions.melanger(PaquetPionTransport.getInstance());
            }
            int tmp = this.cartes.total() - 4;

            if (tmp > 0) {
                PaquetCartesVoyages.getInstance().piocher(tmp, this.cartes);

            }
        } catch (PaquetVideException e) {

            System.out.println(this.nom + " à deconner pdt la défausse (trop vide)");

        } catch (TypeMismatchException e) {
            System.out.println(this.nom + " à deconner pdt la défausse (mauvais type)");
        } finally {
            super.updatePartie();
        }
    }

    /**
     * Fait se déplacer le joeur.
     */
    @Override
    public void deplacer() {
        try {
            Vector<MouvementLegal> moves = MouvementLegal.getMoves(this);
            if (moves.size() != 0) {
                MouvementLegal mv = moves.elementAt((int) (moves.size() * Math.random()));
                bouge(mv.getDest());
                if (mv.getT() == null) {
                    PaquetCartesVoyages.getInstance().piocher((int) mv.getCost(), this.cartes);

                } else {
                    this.cartes.transferNb(mv.getT(), (int) mv.getCost(), PaquetCartesVoyages.getInstance());
                }
                this.fireEventToListeners(mv.getDest(), mv.getT(), null);
            } else {
                passe();
            }
        } catch (PaquetVideException ex) {
            Logger.getLogger(JoeurAlea.class.getName()).log(Level.SEVERE, null, ex);
        } catch (TypeMismatchException ex) {
            Logger.getLogger(JoeurAlea.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            super.updatePartie();
        }
    }

    /**
     * Fait placer un pion au joeur.
     */
    @Override
    public void placePion() {

        Vector<EmplacementLegal> pos = EmplacementLegal.getPos(this, p.getG());
        if (pos.size() != 0) {

            EmplacementLegal el = pos.get((int) (pos.size() * Math.random()));
            Transport t = el.getT();
            int index = t.ordinal();
            Chemin c = el.getC();
            fireEventToListeners(null, t, c);
            c.setPion(t);

            if(this.pions.getPaquet()[index] > 0){
               this.pions.getPaquet()[index]--;
            }else{
               this.pions.retirerCaché(index);
                }
            this.fireEventToListeners(null, t, c);

            super.updatePartie();
        } else {
            passe();
        }
    }
}

